home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / XPK / Source / xpkmaster / hook_mem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-04  |  2.8 KB  |  114 lines

  1. #ifndef XPKMASTER_HOOK_MEM_C
  2. #define XPKMASTER_HOOK_MEM_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_mem.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_mem.c 1.2 (29.03.97)
  9.     Author:        SDI
  10.     Distribution:    PD
  11.     Description:    Memory IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   01.01.97 : added debug info
  15.  1.2   29.03.97 : added TOTSIZE in inhook
  16. */
  17.  
  18. #include <exec/types.h>
  19. #include <pragma/exec_lib.h>
  20. #include "xpkmaster.h"
  21.  
  22. #ifdef __MAXON__
  23.   #define __asm
  24. #endif
  25.  
  26. /*************************** read-from-mem hook **************************/
  27. static LONG __asm meminfunc(register __a1 struct XpkMasterMsg *msg)
  28. {
  29.   STRPTR bufpos;
  30.   LONG ofs;
  31.  
  32.   bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  33.  
  34.   switch (msg->xmm_Type)
  35.   {
  36.   case XIO_READ:
  37.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_Len)
  38.       return XPKERR_TRUNCATED;
  39.     msg->xmm_BufOfs += msg->xmm_Size;
  40.     if(!msg->xmm_Ptr)
  41.       msg->xmm_Ptr = bufpos;
  42.     else if(bufpos != msg->xmm_Ptr)
  43.       CopyMem(bufpos, msg->xmm_Ptr, msg->xmm_Size);
  44.     break;
  45.   case XIO_SEEK:
  46.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  47.     if((ofs < 0) || (ofs > msg->xmm_Len))
  48.       return XPKERR_IOERRIN;
  49.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  50.     msg->xmm_BufOfs = ofs;
  51.     break;
  52. //  case XIO_ABORT:
  53. //  case XIO_FREE:
  54.   case XIO_TOTSIZE: return XPKERR_BADPARAMS; break; /* always needed */
  55.   }
  56.  
  57.   return 0;
  58. }
  59.  
  60. struct Hook meminhook = { {0}, (ULONG (*) ()) meminfunc, 0, 0};
  61.  
  62. /*************************** write-to-mem hook **************************/
  63. static LONG __asm memoutfunc(register __a1 struct XpkMasterMsg *msg)
  64. {
  65.   STRPTR bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  66.   LONG ofs;
  67.  
  68.   switch (msg->xmm_Type)
  69.   {
  70.   case XIO_SEEK:
  71.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  72.     if((ofs < 0) || (ofs > msg->xmm_BufLen))
  73.       return XPKERR_IOERROUT;
  74.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  75.     msg->xmm_BufOfs = ofs;
  76.     break;
  77.   case XIO_TOTSIZE:
  78.     if(msg->xmm_Flags & XIO_GETOUTBUF)
  79.     {
  80.       if(!(msg->xmm_Buf = (STRPTR) AllocMem(msg->xmm_Size, msg->xmm_MemType)))
  81.     return XPKERR_NOMEM;
  82.       msg->xmm_BufLen = msg->xmm_Size;
  83.     }
  84.     else if(!msg->xmm_Buf)
  85.       return XPKERR_SMALLBUF;
  86.     break;
  87.   case XIO_GETBUF:
  88.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  89.       return XPKERR_SMALLBUF;
  90.     msg->xmm_Ptr = bufpos;
  91.     break;
  92.   case XIO_WRITE:
  93.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  94.       return XPKERR_SMALLBUF;
  95.     if(msg->xmm_Ptr && (msg->xmm_Ptr != bufpos))
  96.       CopyMem(msg->xmm_Ptr, bufpos, msg->xmm_Size);
  97.     msg->xmm_BufOfs += msg->xmm_Size;
  98.     break;
  99.   case XIO_ABORT:
  100.     if((msg->xmm_Flags & XIO_GETOUTBUF) && msg->xmm_Buf)
  101.     {
  102.       FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  103.       msg->xmm_Buf = 0;
  104.     }
  105.     break;
  106.   }
  107.  
  108.   return 0;
  109. }
  110.  
  111. struct Hook memouthook = {{0}, (ULONG (*) ()) memoutfunc,0 ,0};
  112.  
  113. #endif
  114.